{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a href=\"https://colab.research.google.com/github/microsoft/autogen/blob/main/notebook/agentchat_hierarchy_flow_using_select_speaker.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "attachments": {
    "e6173a72-fa95-49db-83c8-899608860952.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwEAAAIvCAIAAACjrECwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAH9ASURBVHhe7d2JP5R74//x3991f+/7PvdZ6pxOJUVE9l2ykyVrIkuWpAjZyZrIvpRSWoRIpRQiSinaEOn83nyu5kxjOXOcYdK8n4/r4WE+c812DXO9Zuaaa/7fH0RERESahw1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EREREmogNRERERJqIDURERESaiA1EtBqjoy8f9j4W0/sPH6RRIiLaONhA9P178XKs++79lus3L166cqGp+eq1m13d956PvpCO/lr8yRTb/e4hR6Klw8tAAx2NO+F/KDwpNXPdGqjnQW9ASASm/KJSaUh9Ou/cFdPr8XFpaL10dN7BPXjn7n387OzqxsHbXd34vedh7/DIs3fv30vzLTI7O9s38KT1Vgf+EhouXr7R2ob5peOWh9soFvvZsgppiIi+C2wg+p49HR6prmtMSEz1DQx1cPGytHOxtHfZ53zA2y/k2Ink85W1/QNPpFm/wPi/fvxdyQYyNLNb5wbyCwozsrD/FhoIN9/TNwiLa/0b6Oat9gMHg8WE6+DuHejuHeDpG+wXfCQy5nhaVt7lK9cm3ryV5v7ifs9DLLewqDhnj4P4SzC3ccQvxxNTr924Jc2xDDQQLsXQ1JYNRPSdYQPRd6ur+15icrqNg9t2XSOs83wCDh+OiMGEHrJ2cNums9fc1in+ZEpb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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Auto Generated Agent Chat: Hierarchy flow using select_speaker\n",
    "\n",
    "AutoGen offers conversable agents powered by LLM, tool, or human, which can be used to perform tasks collectively via automated chat. This framework allows tool use and human participation through multi-agent conversation.\n",
    "Please find documentation about this feature [here](https://microsoft.github.io/autogen/docs/Use-Cases/agent_chat).\n",
    "\n",
    "This notebook is about restricting information flow within agents. Suppose we have the following setup:\n",
    "\n",
    "![image.png](attachment:e6173a72-fa95-49db-83c8-899608860952.png)\n",
    "\n",
    "Constraints:\n",
    "- Team leaders can talk amongst themselves\n",
    "- A team can talk amongst themselves\n",
    "\n",
    "Benefits\n",
    "- By limiting team members can talk to team members, we bring focus to the team.\n",
    "- Information flow from Team A to Team B is made more efficient to let the X1s talk amongst themselves. It is more efficient as agent B2 do not have to see the discussion within Team A.\n",
    "\n",
    "\n",
    "## Requirements\n",
    "\n",
    "AutoGen requires `Python>=3.8`. To run this notebook example, please install:\n",
    "```bash\n",
    "pip install pyautogen\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%capture --no-stderr\n",
    "# %pip install pyautogen~=0.2.0b4"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set your API Endpoint\n",
    "\n",
    "The [`config_list_from_json`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_from_json) function loads a list of configurations from an environment variable or a json file."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.2.0b1\n"
     ]
    }
   ],
   "source": [
    "import autogen\n",
    "\n",
    "print(autogen.__version__)\n",
    "\n",
    "# The default config list in notebook.\n",
    "config_list_gpt4 = autogen.config_list_from_json(\n",
    "    \"OAI_CONFIG_LIST\",\n",
    "    filter_dict={\n",
    "        \"model\": [\"gpt-4\", \"gpt4\", \"gpt-4-32k\", \"gpt-4-32k-0314\", \"gpt-4-32k-v0314\"],\n",
    "    },\n",
    ")\n",
    "\n",
    "# Contributor's config - Please replace with your own, I have replaced mine with an Azure OpenAI endpoint.\n",
    "config_list_gpt4 = autogen.config_list_from_json(\n",
    "        \"OAI_CONFIG_LIST\",\n",
    "        filter_dict={\n",
    "            \"model\": [\"gpt-4\"],\n",
    "        },\n",
    "    )"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It first looks for environment variable \"OAI_CONFIG_LIST\" which needs to be a valid json string. If that variable is not found, it then looks for a json file named \"OAI_CONFIG_LIST\". It filters the configs by models (you can filter by other keys as well). Only the gpt-4 models are kept in the list based on the filter condition.\n",
    "\n",
    "The config list looks like the following:\n",
    "```python\n",
    "config_list = [\n",
    "    {\n",
    "        'model': 'gpt-4',\n",
    "        'api_key': '<your OpenAI API key here>',\n",
    "    },\n",
    "    {\n",
    "        'model': 'gpt-4',\n",
    "        'api_key': '<your Azure OpenAI API key here>',\n",
    "        'base_url': '<your Azure OpenAI API base here>',\n",
    "        'api_type': 'azure',\n",
    "        'api_version': '2023-06-01-preview',\n",
    "    },\n",
    "    {\n",
    "        'model': 'gpt-4-32k',\n",
    "        'api_key': '<your Azure OpenAI API key here>',\n",
    "        'base_url': '<your Azure OpenAI API base here>',\n",
    "        'api_type': 'azure',\n",
    "        'api_version': '2023-06-01-preview',\n",
    "    },\n",
    "]\n",
    "```\n",
    "\n",
    "If you open this notebook in colab, you can upload your files by clicking the file icon on the left panel and then choosing \"upload file\" icon.\n",
    "\n",
    "You can set the value of config_list in other ways you prefer, e.g., loading from a YAML file."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extending GroupChat\n",
    "\n",
    "\n",
    "Custom Speaker Selection Logic: The CustomGroupChat class allows us to define our own logic for selecting the next speaker in the group chat. The base GroupChat class has a default logic that may not be suitable for all scenarios.\n",
    "\n",
    "\n",
    "Content-Driven Speaker Selection: This custom class lets us select the next speaker based on the content of the last message, like \"NEXT: A2\" or \"TERMINATE\". The base GroupChat class does not have this capability.\n",
    "\n",
    "Team-Based Logic: The custom class enables team-based logic for speaker selection. It allows the next speaker to be chosen from the same team as the last speaker or from a pool of team leaders, which is something the base GroupChat class does not offer.\n",
    "\n",
    "Previous Speaker Exclusion: The CustomGroupChat class includes logic to prevent the last speaker and the previous speaker from being selected again immediately, which adds more dynamism to the conversation.\n",
    "\n",
    "Flexibility: Extending the base GroupChat class allows us to preserve the existing functionalities and methods while adding new features specific to our needs. This makes the code more modular and easier to maintain.\n",
    "\n",
    "Special Cases Handling: The custom class can also handle special cases, like terminating the chat or transitioning to a 'User_proxy', directly within its select_speaker method.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "llm_config = {\"config_list\": config_list_gpt4, \"cache_seed\": 42}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from autogen.agentchat.groupchat import GroupChat\n",
    "from autogen.agentchat.agent import Agent\n",
    "from autogen.agentchat.assistant_agent import AssistantAgent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "from typing import List, Dict\n",
    "\n",
    "class CustomGroupChat(GroupChat):\n",
    "    def __init__(self, agents, messages, max_round=10):\n",
    "        super().__init__(agents, messages, max_round)\n",
    "        self.previous_speaker = None  # Keep track of the previous speaker\n",
    "    \n",
    "    def select_speaker(self, last_speaker: Agent, selector: AssistantAgent):\n",
    "        # Check if last message suggests a next speaker or termination\n",
    "        last_message = self.messages[-1] if self.messages else None\n",
    "        if last_message:\n",
    "            if 'NEXT:' in last_message['content']:\n",
    "                suggested_next = last_message['content'].split('NEXT: ')[-1].strip()\n",
    "                print(f'Extracted suggested_next = {suggested_next}')\n",
    "                try:\n",
    "                    return self.agent_by_name(suggested_next)\n",
    "                except ValueError:\n",
    "                    pass  # If agent name is not valid, continue with normal selection\n",
    "            elif 'TERMINATE' in last_message['content']:\n",
    "                try:\n",
    "                    return self.agent_by_name('User_proxy')\n",
    "                except ValueError:\n",
    "                    pass  # If 'User_proxy' is not a valid name, continue with normal selection\n",
    "        \n",
    "        team_leader_names = [agent.name for agent in self.agents if agent.name.endswith('1')]\n",
    "\n",
    "        if last_speaker.name in team_leader_names:\n",
    "            team_letter = last_speaker.name[0]\n",
    "            possible_next_speakers = [\n",
    "                agent for agent in self.agents if (agent.name.startswith(team_letter) or agent.name in team_leader_names) \n",
    "                and agent != last_speaker and agent != self.previous_speaker\n",
    "            ]\n",
    "        else:\n",
    "            team_letter = last_speaker.name[0]\n",
    "            possible_next_speakers = [\n",
    "                agent for agent in self.agents if agent.name.startswith(team_letter) \n",
    "                and agent != last_speaker and agent != self.previous_speaker\n",
    "            ]\n",
    "\n",
    "        self.previous_speaker = last_speaker\n",
    "\n",
    "        if possible_next_speakers:\n",
    "            next_speaker = random.choice(possible_next_speakers)\n",
    "            return next_speaker\n",
    "        else:\n",
    "            return None\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Termination message detection\n",
    "def is_termination_msg(content) -> bool:\n",
    "    have_content = content.get(\"content\", None) is not None\n",
    "    if have_content and \"TERMINATE\" in content[\"content\"]:\n",
    "        return True\n",
    "    return False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[33mB2\u001b[0m (to chat_manager):\n",
      "\n",
      "Find the product of x and y, the other agents know x and y.\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mB1\u001b[0m (to chat_manager):\n",
      "\n",
      "NEXT: A1\n",
      "Can you or any of your team members provide the values for x and y? B2 needs these values to complete a task.\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "Extracted suggested_next = A1\n",
      "Can you or any of your team members provide the values for x and y? B2 needs these values to complete a task.\n",
      "\u001b[33mA1\u001b[0m (to chat_manager):\n",
      "\n",
      "Sure B1, let me check with my team. \n",
      "\n",
      "NEXT: A2, A3\n",
      "Could either of you provide the values for x and y? B2 needs these values to complete a task.\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "Extracted suggested_next = A2, A3\n",
      "Could either of you provide the values for x and y? B2 needs these values to complete a task.\n",
      "\u001b[33mA2\u001b[0m (to chat_manager):\n",
      "\n",
      "Sure, I hold the value for x. We know x is equal to 9. A3, could you please provide the value of y?\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mA3\u001b[0m (to chat_manager):\n",
      "\n",
      "Sure, the value of y that I hold is 5.\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "\u001b[33mA1\u001b[0m (to chat_manager):\n",
      "\n",
      "NEXT: B1\n",
      "The values we have for x and y are x=9, y=5. Could you pass this information to B2 to complete the task?\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "Extracted suggested_next = B1\n",
      "The values we have for x and y are x=9, y=5. Could you pass this information to B2 to complete the task?\n",
      "\u001b[33mB1\u001b[0m (to chat_manager):\n",
      "\n",
      "Absolutely, A1.\n",
      "\n",
      "NEXT: B2\n",
      "The values for x and y are x=9, y=5. Could you please compute the product of x and y?\n",
      "\n",
      "--------------------------------------------------------------------------------\n",
      "Extracted suggested_next = B2\n",
      "The values for x and y are x=9, y=5. Could you please compute the product of x and y?\n",
      "\u001b[33mB2\u001b[0m (to chat_manager):\n",
      "\n",
      "Sure, the product of x and y, where x=9 and y=5, is 45.\n",
      "\n",
      "TERMINATE.\n",
      "\n",
      "--------------------------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "# Initialization\n",
    "agents_A = [\n",
    "    AssistantAgent(name='A1', \n",
    "                   system_message=\"You are a team leader A1, your team consists of A2, A3. You can talk to the other team leader B1, whose team member is B2.\",\n",
    "                   llm_config=llm_config),\n",
    "    AssistantAgent(name='A2', \n",
    "                   system_message=\"You are team member A2, you know the secret value of x but not y, x = 9. Tell others x to cooperate.\",\n",
    "                   llm_config=llm_config),\n",
    "    AssistantAgent(name='A3', \n",
    "                   system_message=\"You are team member A3, You know the secret value of y but not x, y = 5. Tell others y to cooperate.\",\n",
    "                   llm_config=llm_config)\n",
    "]\n",
    "\n",
    "agents_B = [\n",
    "    AssistantAgent(name='B1', \n",
    "                   system_message=\"You are a team leader B1, your team consists of B2. You can talk to the other team leader A1, whose team member is A2, A3. Use NEXT: A1 to suggest talking to A1.\",\n",
    "                   llm_config=llm_config),\n",
    "    AssistantAgent(name='B2', \n",
    "                   system_message=\"You are team member B2. Your task is to find out the value of x and y and compute the product. Once you have the answer, say out the answer and append a new line with TERMINATE.\",\n",
    "                   llm_config=llm_config)\n",
    "]\n",
    "\n",
    "# Terminates the conversation when TERMINATE is detected.\n",
    "user_proxy = autogen.UserProxyAgent(\n",
    "        name=\"User_proxy\",\n",
    "        system_message=\"Terminator admin.\",\n",
    "        code_execution_config=False,\n",
    "        is_termination_msg=is_termination_msg,\n",
    "        human_input_mode=\"NEVER\")\n",
    "\n",
    "list_of_agents = agents_A + agents_B\n",
    "list_of_agents.append(user_proxy)\n",
    "\n",
    "# Create CustomGroupChat\n",
    "group_chat = CustomGroupChat(\n",
    "    agents=list_of_agents,  # Include all agents\n",
    "    messages=['Everyone cooperate and help agent B2 in his task. Team A has A1, A2, A3. Team B has B1, B2. Only members of the same team can talk to one another. Only team leaders (names ending with 1) can talk amongst themselves. You must use \"NEXT: B1\" to suggest talking to B1 for example; You can suggest only one person, you cannot suggest yourself or the previous speaker; You can also dont suggest anyone.'],\n",
    "    max_round=30\n",
    ")\n",
    "\n",
    "\n",
    "# Create the manager\n",
    "llm_config = {\"config_list\": config_list_gpt4, \"cache_seed\": None}  # cache_seed is None because we want to observe if there is any communication pattern difference if we reran the group chat.\n",
    "manager = autogen.GroupChatManager(groupchat=group_chat, llm_config=llm_config)\n",
    "\n",
    "\n",
    "# Initiates the chat with B2\n",
    "agents_B[1].initiate_chat(manager, message=\"Find the product of x and y, the other agents know x and y.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
